package com.example;

/**
 * @Author loubobooo
 * @Description #98. 验证二叉搜索树
 * @Date 2022/3/2
 */
public class ValidateBinarySearchTree {

    class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode() {
        }

        TreeNode(int val) {
            this.val = val;
        }

        TreeNode(int val, TreeNode left, TreeNode right) {
            this.val = val;
            this.left = left;
            this.right = right;
        }
    }

    private Long MIN_VALUE = Long.MIN_VALUE;
    private Long MAX_VALUE = Long.MAX_VALUE;
    
    /**
     * 方法描述:给你一个二叉树的根节点 root ，判断其是否是一个有效的二叉搜索树。
     * 有效 二叉搜索树定义如下：
     * 节点的左子树只包含 小于 当前节点的数。
     * 节点的右子树只包含 大于 当前节点的数。
     * 所有左子树和右子树自身必须也是二叉搜索树。
     *
     * 示例 1：
     *
     * 输入：root = [2,1,3]
     * 输出：true
     * @param: [root]
     * @return: boolean
     * @author: loubobooo
     * @date: 2022/3/2
     */
    public boolean isValidBST(TreeNode root) {
        return helper(root, MIN_VALUE, MAX_VALUE);
    }

    private boolean helper(TreeNode node, long min, long max){
        if(node == null){
            return true;
        }
        if(node.val <= min || node.val >= max){
            return false;
        }
        return helper(node.left, min, node.val) && helper(node.right, node.val, max);
    }

}
